#include "light.h"
//此程序是基于6818开发板的
//水平显示
void light_s(char *framebuffer)
{
    // 颜色序列 - 蓝红粉白
    uint32_t colors[4] = {0xFFFF0000, 0xFF0000FF, 0xFFFFC0CB, 0xFFFFFFFF};
        
    // frame是推着颜色线走的那个
    for(int frame = 0; ; frame++)
    {
        // 第一条颜色线（蓝）
        for(int row = 0; row < 480; row++)
        {
            //这条颜色线在当前屏幕的位置
            int current_row = (row + frame) % 480;
            int row_offset = current_row * 800 * 4;
            int color = (row/120)%4;//这样color就根据高的不同而绘制不同颜色

            // 绘制一行像素
            for(int col = 0; col < 800; col++)
            {
                memcpy(framebuffer + 4 * col + row_offset, &colors[color], 4);
            }
        }
        
        // 添加短暂延时以产生动画效果
        usleep(50); // 5毫秒延时
    }
}
// 斜线显示 - 色块间距恒为200像素
void light_x(char *framebuffer)
{
    // 颜色序列：蓝、红、粉、白
    uint32_t colors[4] = {0xFF0000FF, 0xFFFF0000, 0xFFFFC0CB, 0xFFFFFFFF};
    
    // 斜率系数（可任意修改：1,2,3...）
    int k = -3;  
    
    // 目标间距：垂直于斜线方向的视觉宽度（200像素）
    const int target_spacing = 200;
    
    // 1. 精确计算几何补偿系数
    // 原理：垂直距离 = 沿斜线的间隔 / sqrt(k²+1)
    // 因此：沿斜线的间隔 = 目标间距 * sqrt(k²+1)
    float factor = sqrt(k*k + 1);
    // 使用round四舍五入，避免整数截断误差
    int adjusted_interval = (int)round(target_spacing * factor);
    
    // 2. 动画帧（控制斜线移动，无模运算避免截断）
    int frame = 0;
    while(1)  // 替换for(;;)使逻辑更清晰
    {
        // 遍历所有像素
        for(int row = 0; row < 480; row ++)
        {
            for(int col = 0; col < 800; col ++)
            {
                // 修正斜线位置计算：沿斜线方向的累计距离
                // 公式推导：对于斜线y = kx + b，b = y - kx，沿b方向的间隔即adjusted_interval
                int distance_along_line = (row - k * col) + frame;
                
                // 3. 计算颜色索引（确保间隔严格为adjusted_interval）
                // 使用取模前先偏移，避免负数值导致的颜色错乱
                int color_idx = ((distance_along_line % (adjusted_interval * 4) + adjusted_interval * 4) 
                                % (adjusted_interval * 4)) / adjusted_interval;
                
                // 绘制像素
                int pixel_offset = row * 800 * 4 + col * 4;
                memcpy(framebuffer + pixel_offset, &colors[color_idx], 4);
            }
        }
        
        frame+=2;  // 帧递增，控制动画速度
        // usleep(1);
    }
}

int main(int argc ,char *argv[])
{
    //初始化lcd
    int lcd = open("/dev/fb0",O_RDWR);
    //这是获得指向映射内存的指针
    char *fb_mem = mmap(NULL ,800*480*4, PROT_WRITE, MAP_SHARED, lcd, 0);

    //弄一个显示霓虹灯的函数(水平的)
    //light_s(fb_mem);
    //弄一个显示霓虹灯的函数(斜的)
    light_x(fb_mem);

    //释放内存
    munmap(fb_mem, 800*480*4);

    return 0;
}